package com.day20_reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

/**
 * @ClassName: Relect_test02
 * @Author: zw
 * @Description: 出百万拳，行万里路；
 * @Create 2024/3/31-11:46
 * @Version 1.0
 */
public class Relect_test02 {
    public static void main(String[] args) throws NoSuchFieldException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException {
        // 获取成员变量并使用
        Class<Stduent> c1 = Stduent.class;
        // getFields获取可见公共成员变量数组
        // getDeclaredFields（）获取所有的成员变量，（私有，公共，默认）的数组
        Field[] fields = c1.getFields();// getFields获取成员变量
        Field[] declaredFields = c1.getDeclaredFields();
        System.out.println("getFields获取可见公共成员变量数组");
        for (Field field: fields) {
            System.out.println(field);
        }
        System.out.println("getDeclaredFields（）获取所有的成员变量");
        for (Field decalreV: declaredFields) {
            System.out.println(decalreV);
        }
        // getField 获取单个的公共成员变量
        System.out.println("获取单个的公共");
        Field levle = c1.getField("levle");
        System.out.println(levle);
        // getDeclaredField 获取单个的成员变量name
        Field name = c1.getDeclaredField("name");
        System.out.println("获取单个的成员变量name");
        System.out.println(name);

        // 通过反射 创建对象，设置成员变量的值
        // 获取到构造函数
        Constructor<Stduent> constructor = c1.getConstructor();
        // 通过constructor.newInstance() 创建对象
        Stduent stduent = constructor.newInstance();
        // 设置成员变量的值, 这是通过对象. 方法 设置成员变量的值
        stduent.levle = "高级";
        name.setAccessible(true);
        levle.set(stduent, "中级"); // 设置公有变量
        // // 通过反射的方法进行设置成员变量之前应该调用setAccessible取消访问检查
        name.set(stduent, "林正英"); // 设置私有变量
        System.out.println(stduent);
    }
}